package top.fwpsl.script.base

/**
  * 声明变量
  *
  * @author 风戏fw
  * @date 2020/11/18
  */
object VariableDemo {

  /**
    * scala 中没有 static 关键字对于一个class来说，所有的方法和成员变量在实例被 new 出来之前都是无法访问的因此class文件
    * > 中的main方法也就没什么用了，scala object 中所有成员变量和方法默认都是 static 的所以 可以直接访问main方法。
    *
    * Scala声明变量有两种方式，一个用val，一个用var。
    * val / var 变量名 : 变量类型 = 变量值。
    * val定义的值是不可变的，它不是一个常量，是不可变量，或称之为<b>只读变量</b>。
    *
    * 提示：
    * 1、scala 默认为匿名变量分配val
    * 2、val定义的变量虽然不能改变其引用的内存地址，但是可以改变其引用的对象的内部的其他属性值。
    * 3、为了减少可变性引起的bug，应该尽可能地使用不可变变量。变量类型可以省略，解析器会根据值进行推断。
    * > val和var声明变量时都必须初始化。
    *
    */

  /**
    * def 定义一个方法
    * main 方法名称
    * ()括号中为参数
    * args 形参名称
    * :冒号后面是参数类型
    * Array[String] Array数组 String数组的元素类型
    * Unit 返回值类型，Unit表示无返回值，如果没有返回值:Unit =可以省略
    */

  def main(args: Array[String]) {
    // 使用val定义的变量值是不可变的，相当于java里用final修饰的变量
    // 语句后面可以省略 分号
    val i = 1
    // 使用var定义的变量是可变得，在Scala中鼓励使用val
    var s = "hello"
    // Scala编译器会自动推断变量的类型，必要的时候可以指定类型
    // 变量名在前，类型在后
    val str: String = "bigdata"

    val w1 = "World"
    val w2 = "World"
    println("Hello World")
    println(s"Hello $w1 ") // $w1后面加空格
    println(s"Hello $w1, psl") // $w1后面加空格
    println("Hello $w2")
    printf("Hello %s\n", w2)
    val w3 = "World"
    val w4 = "Hello World"
    println("Hello " + w3)
    printf("%s\n", w4)
  }
}
